package com.peak.spring.boot.api.manager;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import com.peak.spring.boot.api.repository.FilterParam;

/**
 * 所有的对数据库的操作通用接口，Manager的主接口方法，已默认主键类型为Number
 * 
 * @author Haley Gao
 *
 * @param <T>
 */
public interface BaseManager<T> {

	/**
	 * 根据ID查询，延迟加载数据
	 * @param id
	 * @return
	 */
	T getOne(Number id);
	
	/**
	 * 根据ID查询，直接返回对象
	 * @param id
	 * @return
	 */
	T findOne(Number id);
	
	/**
	 * 查询所有记录
	 * 
	 * @return
	 */
	List<T> findAll();

	/**
	 * 根据ID的集合查询所有对象
	 * @param ids
	 * @return
	 */
	List<T> findAll(Iterable<Number> ids);
	
	/**
	 * 根据ID集合查询，带排序功能
	 * @param sort
	 * @return
	 */
	List<T> findAll(Sort sort);
	
	/**
	 * 分页查询，无查询条件
	 * @param pageable
	 * @return
	 */
	Page<T> findPage(Pageable pageable);
	
	/**
	 * 根据字段名和字段值相等查询
	 * @param fieldName
	 * @param value
	 * @return
	 */
	T findOne(String fieldName, Object value);
	
	/**
	 * 根据查询条件查询唯一结果，如果不唯一将抛异常
	 * @param filterParams
	 * @return
	 */
	T findOne(List<FilterParam> filterParams);
	
	/**
	 * 根据查询条件查询所有结果，返回第一条记录
	 * @param filterParams
	 * @return
	 */
	T findFirstOne(List<FilterParam> filterParams);
	
	/**
	 * 根据查询条件查询所有结果，返回第一条记录
	 * 
	 * @param filterParams
	 * @param sort
	 * @return
	 */
	T findFirstOne(List<FilterParam> filterParams, Sort sort);

	/**
	 * 根据查询条件查询
	 * 
	 * @param filterParams
	 * @return
	 */
	List<T> findList(List<FilterParam> filterParams);
	
	/**
	 * 根据查询条件查询，带排序功能
	 * @param filterParams
	 * @param sort
	 * @return
	 */
	List<T> findList(List<FilterParam> filterParams, Sort sort);
	
	/**
	 * 根据查询条件分页查询
	 * @param filterParams
	 * @param pageable
	 * @return
	 */
	Page<T> findPage(List<FilterParam> filterParams, Pageable pageable);
	
	/**
	 * 统计数量
	 * @param filterParams
	 * @return
	 */
	int count(List<FilterParam> filterParams);
	
	/**
	 * 判断是否唯一记录,唯一返回true
	 * @param filterParams
	 * @param entity
	 * @return
	 */
	boolean checkUnique(List<FilterParam> filterParams, T entity);
	
	/**
	 * 保存数据，根据ID判断，如果ID为null，则insert记录，ID有值，则update记录
	 * @param entity
	 * @return
	 */
	<S extends T> S save(S entity);
	
	/**
	 * 批量保存，根据配置的batch数量进行提交数据
	 * @param entities
	 * @return
	 */
	<S extends T> List<S> save(Iterable<S> entities);
	
	/**
	 * 根据ID删除记录
	 * @param id
	 */
	void delete(Number id);

	/**
	 * 删除数据
	 * @param entity
	 */
	void delete(T entity);

	/**
	 * 批量删除数据，SQL将写在一句里
	 * @param entities
	 */
	void delete(Iterable<T> entities);
}
